package com.wjc.lib.io;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * ClassName: com.wjc.lib.io
 * Description:
 * JcChen on 2022.02.20.00:21
 */
class test {
    public static void main(String[] args) {
//        float i = 1234;
//        int a = (int) i / 1000;
//        int b = ((int) i / 100) % 10;
//        int c = ((int) i / 10) % 10;
//        int d = (int) i % 10;
//        System.out.println("a=" + a + ",b=" + b + ",c=" + c + ",d=" + d);

//        int[] nums = new int[]{-1, 0, 1, 2, -1, -4, -2, -3, 3, 0, 4};
//        threeSum(nums);

//        int[] nums1 = new int[]{1, 2, 3, 0, 0, 0};
//        int[] nums2 = new int[]{2, 2, 1, 1, 1, 2, 2};
//        merge(nums1, 3, nums2, 3);
        isAnagram("aaaasbb", "aaaabbs");
    }

    // a[i]++ 增加索引 i 处的元素，它不增加 i
    // a[i++] 递增 i，而不是索引 i 处的元素。
    public static boolean isAnagram(String s, String t) {
        // s 和 t 仅包含小写字母
        if(s.length() != t.length()) {
            return false;
        }
        int[] temp = new int[26];
        for (int i = 0; i < s.length(); i++) {
            int j = s.charAt(i) - 'a';
            temp[j]++;
//            temp[j] = temp[j] + j;
            System.out.println("-----==" + temp[j] + ",j=" + j);
        }
        for (int i = 0; i < t.length(); i++) {
            int xj = t.charAt(i) - 'a';
            temp[xj] --;
//            temp[xj] = temp[xj] - xj;
            System.out.println("=======" + temp[xj] + ",xj=" + xj);
            if(temp[xj] < 0) {
                return false;
            }
        }
        return true;

//    -----==0
//-----==13
//-----==0
//-----==6
//-----==17
//-----==0
//-----==12
//
//        char[] sList = s.toCharArray();
//        int sLength = sList.length;
//        StringBuilder sR = new StringBuilder();
//        for (int i = sLength - 1; i > 0; i--) {
//            System.out.println("sList[i]="+sList[i]);
//
//            sR.append(sList[i]);
//        }
//        System.out.println("sr="+sR);
//        return sR.toString().equals(t);

    }

    // 相同数
    public boolean containsDuplicate(int[] nums) {
        Set<Integer> hashSet = new HashSet<>();
        for (int i = 0; i < nums.length - 1; i++) {
            if(!hashSet.add(nums[i])) {
                return true;
            }
        }
        return false;
    }

    public static int majorityElement(int[] nums) {
        Map<Integer, Integer> map = new HashMap<>();
        for (int i = 0; i < nums.length; i++) {
            if(map.containsKey(nums[i])) {
                map.put(nums[i], map.get(nums[i]) + 1);
            } else {
                map.put(nums[i], 1);
            }
        }
        Map.Entry<Integer, Integer> maj = null;

        for (Map.Entry<Integer, Integer> entry : map.entrySet()) {
            if(maj == null || entry.getValue() < maj.getValue()) {
                maj = entry;
            }
        }
        return maj.getKey();
    }

    public static void merge(int[] nums1, int m, int[] nums2, int n) {
        if(m == 0) {
            nums1 = nums2;
            return;
        }
        if(n == 0) {
            return;
        }

        int[] temp = new int[m + n];
        int p1 = 0, p2 = 0;
        int cus;
        while (p1 < m || p2 < n) {
            if(p1 == m) {// 说明符合 p2<n 条件
                cus = nums2[p2++];
            } else if(p2 == n) {
                cus = nums1[p1++];
            } else if(nums1[p1] > nums2[p2]) {
                cus = nums2[p2++];
            } else {
                cus = nums1[p1++];
            }
            temp[p1 + p2 - 1] = cus;
        }
        nums1 = temp;
    }


    public static List<List<Integer>> threeSum(int[] nums) {
        List<List<Integer>> result = new ArrayList();

        if(nums.length < 3) {
            return result;
        }
        Arrays.sort(nums); // 排序

        for (int i = 0; i < nums.length; i++) {

            if(nums[i] > 0) {
                break;

            }
            if(i > 0 && nums[i] == nums[i - 1]) {
                continue;
            }
            int R = nums.length - 1;

            int L = i + 1;
            System.out.println("i=" + i + ",L=" + L);
            while (L < R) {
                int sum = nums[i] + nums[L] + nums[R];
                System.out.println(nums[i] + "," + nums[L] + "," + nums[R] + "，---L=" + L + "，R=" + R);
                if(sum == 0) {
                    result.add(Arrays.asList(nums[i], nums[L], nums[R]));
                    while (L < R && nums[L] == nums[L + 1]) L++;
                    while (L < R && nums[R] == nums[R - 1]) R--;
                    R--;
                    L++;
                } else if(sum > 0) {
                    R--;
                } else if(sum < 0) {
                    L++;
                }

            }
        }

        return result;
    }


    public static List<List<Integer>> threeSum1(int[] nums) {
        List<List<Integer>> ans = new ArrayList();
        int len = nums.length;
        if(len < 3) {
            return ans;
        }
        Arrays.sort(nums); // 排序
        for (int i = 0; i < len; i++) {
            if(nums[i] > 0) {
                break; // 如果当前数字大于0，则三数之和一定大于0，所以结束循环
            }
            if(i > 0 && nums[i] == nums[i - 1]) {
                continue; // 去重
            }
            int L = i + 1;
            int R = len - 1;
            System.out.println("i=" + i + ",L=" + L);

            while (L < R) {
                int sum = nums[i] + nums[L] + nums[R];
                System.out.println(nums[i] + "," + nums[L] + "," + nums[R] + "，---L=" + L + "，R=" + R);

                if(sum == 0) {
                    ans.add(Arrays.asList(nums[i], nums[L], nums[R]));
                    while (L < R && nums[L] == nums[L + 1]) L++; // 去重
                    while (L < R && nums[R] == nums[R - 1]) R--; // 去重
                    L++;
                    R--;

                } else if(sum < 0) {
                    L++;
                } else if(sum > 0) {
                    R--;
                }
            }
        }
        return ans;
    }

}
